Skill

Django ডাটাবেস সম্পর্ক এবং ORM কুয়েরি

Web Development - জ্যাঙ্গো (Django)
220

Django একটি শক্তিশালী Object-Relational Mapping (ORM) সিস্টেম সরবরাহ করে, যা ডাটাবেসের সাথে কাজ করার জন্য Python কোড ব্যবহার করতে সাহায্য করে। ORM এর মাধ্যমে আপনি SQL কুয়েরি লেখার পরিবর্তে Python কোড ব্যবহার করে ডাটাবেসের টেবিলগুলোর সাথে ইন্টারঅ্যাক্ট করতে পারেন। Django ORM ডাটাবেস মডেলকে Python ক্লাসের মাধ্যমে রিপ্রেজেন্ট করে এবং আপনাকে SQL কুয়েরি লেখার প্রয়োজন ছাড়াই ডাটাবেস অপারেশন করতে দেয়।

এই টিউটোরিয়ালে আমরা Django ORM সম্পর্ক এবং এর বিভিন্ন কুয়েরি ফাংশনগুলো কিভাবে ব্যবহার করতে হয়, তা বিস্তারিতভাবে আলোচনা করব।


Django ORM কি?

Object-Relational Mapping (ORM) হল একটি প্রোগ্রামিং টেকনিক যা ডাটাবেসের রিলেশনাল টেবিলগুলোকে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষার ক্লাসের সাথে ম্যাপ করে। Django ORM এর মাধ্যমে আপনি Python কোড ব্যবহার করে ডাটাবেসের টেবিলের মতো ডেটা ম্যানিপুলেট করতে পারেন, SQL কুয়েরি ছাড়াই। এটি কোডকে পরিষ্কার, রিডেবল এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।


Django মডেল তৈরি করা

Django এর ORM ব্যবহার করার জন্য প্রথমে আপনাকে Model তৈরি করতে হবে। মডেল হল Python ক্লাস, যা ডাটাবেসের টেবিলের রূপে ব্যবহৃত হয়। একটি মডেল ক্লাসে আপনি ফিল্ডস (যেমন: CharField, IntegerField ইত্যাদি) এবং মেথড ডিফাইন করবেন, যা টেবিলের কলাম এবং লজিক্যাল অপারেশনগুলোকে রিপ্রেজেন্ট করে।

১. মডেল তৈরি করা

ধরা যাক আপনি একটি ব্লগ অ্যাপ্লিকেশন তৈরি করছেন, যেখানে "Post" এবং "Comment" টেবিল থাকবে। এর জন্য Django মডেল তৈরি করা যেতে পারে।

# models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.content[:50]

এখানে, Post এবং Comment দুটি মডেল তৈরি করা হয়েছে। Comment মডেলটি Post মডেলের সাথে সম্পর্কিত (ForeignKey ব্যবহার করে)।


Django ORM কুয়েরি ব্যবহারের মাধ্যমে ডাটাবেস অপারেশন

Django ORM আপনাকে বিভিন্ন ধরনের ডাটাবেস অপারেশন করতে সাহায্য করে যেমন ডাটা ইনসার্ট, আপডেট, ডিলিট এবং ফিল্টার করা। নিচে কিছু সাধারণ কুয়েরি অপারেশন দেওয়া হলো:

১. ডাটা তৈরি (Create)

Django ORM এর মাধ্যমে নতুন ডাটা টেবিলে ইনসার্ট করা সহজ। উদাহরণস্বরূপ, একটি নতুন পোস্ট তৈরি করা:

# views.py

from .models import Post

def create_post(request):
    new_post = Post.objects.create(
        title='My First Post',
        content='This is the content of my first post.'
    )
    return HttpResponse(f"Post created with title: {new_post.title}")

এখানে Post.objects.create() মেথডটি একটি নতুন পোস্ট তৈরি করে এবং তা ডাটাবেসে ইনসার্ট করে।

২. ডাটা পড়া (Read)

Django ORM এর মাধ্যমে ডাটাবেস থেকে ডাটা ফেচ করা সহজ। objects ম্যানেজার ব্যবহার করে আপনি টেবিলের ডাটা কুয়েরি করতে পারেন।

সব পোস্ট ফেচ করা:

# views.py

def list_posts(request):
    posts = Post.objects.all()
    for post in posts:
        print(post.title)
    return HttpResponse("Check console for post titles.")

কিছু নির্দিষ্ট পোস্ট ফেচ করা:

# views.py

def post_detail(request, post_id):
    post = Post.objects.get(id=post_id)  # একক পোস্ট ফেচ
    return HttpResponse(f"Post title: {post.title}")

ফিল্টারিং পোস্ট:

# views.py

def filter_posts(request):
    posts = Post.objects.filter(title__icontains='Django')  # Django শব্দটি সহ সব পোস্ট
    return HttpResponse(f"Found {posts.count()} posts with 'Django' in the title.")

এখানে icontains ব্যবহার করা হয়েছে, যা কেস-ইনসেনসিটিভ টেক্সট ম্যাচিংয়ের জন্য।

৩. ডাটা আপডেট (Update)

আপনি ORM এর মাধ্যমে ডাটাবেসে আগের ইনসার্ট করা ডাটা আপডেট করতে পারেন।

# views.py

def update_post(request, post_id):
    post = Post.objects.get(id=post_id)
    post.title = "Updated Title"
    post.save()  # save() ফাংশনটি ডাটাবেসে পরিবর্তন সেভ করবে
    return HttpResponse(f"Post updated: {post.title}")

৪. ডাটা ডিলিট (Delete)

Django ORM ব্যবহার করে ডাটাবেস থেকে ডাটা ডিলিট করা খুব সহজ।

# views.py

def delete_post(request, post_id):
    post = Post.objects.get(id=post_id)
    post.delete()  # ডিলিট ফাংশন ডাটাবেস থেকে পোষ্টটি মুছে ফেলে
    return HttpResponse(f"Post with id {post_id} deleted.")

Django ORM এর উন্নত কুয়েরি ফাংশন

Django ORM আরও উন্নত কুয়েরি অপারেশন যেমন জয়েন, অগ্রাধিকার, গ্রুপিং, অ্যাগ্রিগেট ফাংশন ইত্যাদি সমর্থন করে। কিছু উদাহরণ:

১. জয়েন অপারেশন (Join)

# একটি পোস্টের সাথে তার কমেন্টস গুলি আনার জন্য
post = Post.objects.get(id=1)
comments = post.comments.all()  # ForeignKey সম্পর্কের মাধ্যমে

২. অ্যাগ্রিগেট (Aggregate) ফাংশন

from django.db.models import Count

# পোস্টের সংখ্যা পাওয়া
post_count = Post.objects.aggregate(Count('id'))

৩. অর্ডারিং (Ordering)

# পোস্টগুলো সৃষ্টির সময় অনুযায়ী সাজানো
posts = Post.objects.all().order_by('-created_at')  # '-' ডেসেনডিং অর্ডার

সারাংশ

Django ORM ডাটাবেস ম্যানিপুলেশনের জন্য একটি অত্যন্ত সুবিধাজনক এবং শক্তিশালী টুল। এটি SQL কুয়েরি লেখার ঝামেলা দূর করে Python কোডের মাধ্যমে ডাটাবেস সম্পর্কিত কার্যক্রম সম্পাদন করতে সহায়ক হয়। Django এর ORM কুয়েরি ব্যবহার করে আপনি সহজেই ডাটা তৈরি, পড়া, আপডেট এবং মুছে ফেলতে পারবেন।

Content added By

মডেলের মধ্যে সম্পর্ক (One-to-One, One-to-Many, Many-to-Many)

204

Django ORM (Object-Relational Mapping) ব্যবহারের মাধ্যমে ডেটাবেসের বিভিন্ন মডেলের মধ্যে সম্পর্ক তৈরি করা যায়। এটি ডেটাবেস টেবিলগুলোর মধ্যে সম্পর্ক স্থাপন এবং তাদের মধ্যে ডেটা পরিচালনা সহজ করে। Django তিনটি প্রধান ধরনের সম্পর্ক সমর্থন করে:

  1. One-to-One সম্পর্ক
  2. One-to-Many সম্পর্ক (ForeignKey)
  3. Many-to-Many সম্পর্ক

এগুলির মধ্যে সম্পর্কগুলি কীভাবে তৈরি এবং ব্যবহৃত হয় তা নিচে বিস্তারিতভাবে আলোচনা করা হলো।


১. One-to-One সম্পর্ক

One-to-One সম্পর্ক হল যখন একটি অবজেক্ট একটির সাথে সম্পর্কিত থাকে এবং অন্যটি শুধুমাত্র একটি অবজেক্টের সাথে সম্পর্কিত থাকে। এই সম্পর্কটি সাধারণত যখন একটি ইউজারের বিস্তারিত তথ্য সংরক্ষণ করতে হয়, তখন ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি User মডেলের সাথে সম্পর্কিত একটি Profile মডেল।

উদাহরণ:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.username


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()
    birthdate = models.DateField()

    def __str__(self):
        return self.user.username

এখানে:

  • OneToOneField ব্যবহৃত হয়েছে, যা User মডেলের সাথে Profile মডেলকে একে অপরের সাথে সংযুক্ত করেছে। এটি একে অপরের সাথে একক সম্পর্ক (One-to-One) তৈরি করে।

ব্যবহার:

# Create a User object
user = User.objects.create(username='john_doe', email='john@example.com')

# Create a Profile object related to the User
profile = Profile.objects.create(user=user, bio='A web developer', birthdate='1990-01-01')

এটি User এবং Profile মডেলগুলির মধ্যে একে অপরের সাথে সম্পর্ক স্থাপন করবে।


২. One-to-Many সম্পর্ক (ForeignKey)

One-to-Many সম্পর্ক হল যখন একটি অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। সাধারণত এই সম্পর্কটি ForeignKey ফিল্ড ব্যবহার করে তৈরি করা হয়, যেখানে এক টেবিলের একটি রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি Author মডেল এবং তার সাথে সম্পর্কিত Book মডেল।

উদাহরণ:

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.title

এখানে:

  • ForeignKey ফিল্ডটি Book মডেলে ব্যবহৃত হয়েছে, যা Author মডেলের সাথে One-to-Many সম্পর্ক স্থাপন করেছে। এক Author একাধিক Book এর সাথে সম্পর্কিত হতে পারে।

ব্যবহার:

# Create an Author object
author = Author.objects.create(name='J.K. Rowling')

# Create multiple Book objects related to the Author
book1 = Book.objects.create(title='Harry Potter and the Sorcerer\'s Stone', author=author)
book2 = Book.objects.create(title='Harry Potter and the Chamber of Secrets', author=author)

এখানে, এক Author একাধিক Book এর সাথে সম্পর্কিত, যা One-to-Many সম্পর্কের উদাহরণ।


৩. Many-to-Many সম্পর্ক

Many-to-Many সম্পর্ক হল যখন একাধিক অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। Django তে Many-to-Many সম্পর্ক তৈরি করতে ManyToManyField ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি Student মডেল এবং একটি Course মডেল, যেখানে এক ছাত্র একাধিক কোর্সে ভর্তি হতে পারে এবং এক কোর্সে একাধিক ছাত্র থাকতে পারে।

উদাহরণ:

class Course(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Student(models.Model):
    name = models.CharField(max_length=100)
    courses = models.ManyToManyField(Course)

    def __str__(self):
        return self.name

এখানে:

  • ManyToManyField ব্যবহৃত হয়েছে, যা Student মডেলের মধ্যে একাধিক Course এর সাথে সম্পর্ক স্থাপন করেছে। এর মাধ্যমে এক ছাত্র একাধিক কোর্সে ভর্তি হতে পারে এবং এক কোর্সে একাধিক ছাত্র থাকতে পারে।

ব্যবহার:

# Create Course objects
course1 = Course.objects.create(name='Math 101')
course2 = Course.objects.create(name='Science 101')

# Create a Student object
student = Student.objects.create(name='Alice')

# Add courses to the student
student.courses.add(course1, course2)

এখানে, Student মডেলের মধ্যে ManyToManyField ব্যবহার করে একাধিক কোর্স যোগ করা হয়েছে এবং এক কোর্সে একাধিক ছাত্র থাকতে পারে।


সারাংশ

Django তে One-to-One, One-to-Many (ForeignKey) এবং Many-to-Many (ManyToManyField) সম্পর্কগুলির মাধ্যমে বিভিন্ন মডেলের মধ্যে সম্পর্ক স্থাপন করা যায়। এই সম্পর্কগুলো ডেটাবেসের মধ্যে টেবিল গুলির মধ্যে সম্পর্ক তৈরি করতে ব্যবহৃত হয়।

  • One-to-One সম্পর্ক: এক মডেল এককভাবে অন্য মডেলের সাথে সম্পর্কিত থাকে।
  • One-to-Many সম্পর্ক: এক মডেল একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে।
  • Many-to-Many সম্পর্ক: একাধিক মডেল একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে।

এই সম্পর্কগুলি Django ORM ব্যবহারের মাধ্যমে সহজে তৈরি এবং পরিচালনা করা যায়।

Content added By

Django এর ORM এর মাধ্যমে Query তৈরি করা

161

Django তে ORM (Object Relational Mapping) একটি শক্তিশালী ফিচার যা ডাটাবেসের সাথে যোগাযোগ করার জন্য Python কোড ব্যবহার করে। ORM ডাটাবেস টেবিলগুলির সাথে সম্পর্কিত Python ক্লাস (মডেল) তৈরি করে এবং আপনাকে SQL কোড লেখার পরিবর্তে Python কোডে ডাটাবেস অপারেশন করতে সাহায্য করে। ORM এর মাধ্যমে আপনি ডাটাবেসের রিড, ক্রিয়েট, আপডেট এবং ডিলিট (CRUD) অপারেশনগুলি সহজে সম্পাদন করতে পারেন।


Django ORM এর মূল ধারণা

Django ORM একটি Python ক্লাস এবং তার ইনস্ট্যান্সের মাধ্যমে ডাটাবেসের টেবিলগুলিকে প্রতিনিধিত্ব করে। এই Python ক্লাসগুলো Model নামে পরিচিত, এবং এগুলি ডাটাবেসের টেবিলের সাথেই সম্পর্কযুক্ত থাকে।

মডেল তৈরি করা

প্রথমে একটি মডেল তৈরি করতে হবে যা ডাটাবেস টেবিলের প্রতিনিধিত্ব করবে। উদাহরণস্বরূপ, একটি Post মডেল তৈরি করা যাক:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title

এখানে:

  • title: একটি চরিত্র ক্ষেত্র (CharField), যেখানে ব্লগ পোস্টের শিরোনাম থাকবে।
  • content: একটি টেক্সট ক্ষেত্র (TextField), যেখানে ব্লগ পোস্টের বাকি কন্টেন্ট থাকবে।
  • created_at: একটি ডেটাটাইম ক্ষেত্র (DateTimeField), যা স্বয়ংক্রিয়ভাবে পোস্টের তৈরি হওয়ার সময় সংরক্ষণ করবে।

Django ORM এর মাধ্যমে Query তৈরি করা

১. ডাটাবেসে নতুন রেকর্ড যোগ করা

নতুন রেকর্ড যুক্ত করার জন্য, Django ORM এ মডেলের ইনস্ট্যান্স তৈরি করে সেটি সেভ করা হয়।

# নতুন পোস্ট তৈরি করা
new_post = Post(title="My First Blog Post", content="This is the content of the post.")
new_post.save()  # ডাটাবেসে সেভ করা

এখানে:

  • new_post.save() ব্যবহার করে পোস্টটি ডাটাবেসে সেভ করা হচ্ছে।

২. সমস্ত রেকর্ড আনা (Retrieve all records)

ডাটাবেসের সমস্ত রেকর্ড প্রাপ্তি জন্য all() মেথড ব্যবহার করা হয়।

# সমস্ত পোস্টগুলি পাওয়া
all_posts = Post.objects.all()

এটি সমস্ত পোস্ট ডাটাবেস থেকে এনে all_posts নামক ভেরিয়েবলে রাখবে। আপনি পরে এই ভেরিয়েবলটি ব্যবহার করে পোস্টগুলি প্রদর্শন করতে পারেন।

৩. নির্দিষ্ট শর্তে রেকর্ড খুঁজে বের করা (Filtering)

নির্দিষ্ট শর্তের ভিত্তিতে রেকর্ড খুঁজে বের করার জন্য filter() মেথড ব্যবহার করা হয়।

# যেখানে title 'First' শব্দ দিয়ে শুরু হয়, সেগুলি খুঁজে বের করা
posts = Post.objects.filter(title__startswith='First')

এখানে title__startswith='First' ব্যবহার করে আমরা এমন সমস্ত পোস্ট পেয়েছি যাদের শিরোনাম "First" দিয়ে শুরু হয়। Django ORM ফিল্টারিংয়ে বিভিন্ন ধরনের এক্সপ্রেশন ব্যবহার করা যেতে পারে, যেমন:

  • exact: নির্দিষ্ট মান।
  • icontains: কেস ইনসেন্সিটিভ উপায়ে কনটেন্ট চেক করা।
  • gte, lte: বড় বা ছোট সমান।

৪. একক রেকর্ড খোঁজা (Getting a single record)

একটি নির্দিষ্ট রেকর্ড খুঁজে বের করার জন্য get() মেথড ব্যবহার করা হয়। এটি একটি একক রেকর্ড রিটার্ন করে, কিন্তু যদি একাধিক রেকর্ড পাওয়া যায়, তবে এটি MultipleObjectsReturned ত্রুটি দিবে।

# একটি নির্দিষ্ট পোস্ট পাওয়া
post = Post.objects.get(id=1)

এখানে, id=1 দিয়ে আমরা প্রথম পোস্টটি খুঁজে পেয়েছি।

৫. রেকর্ড আপডেট করা

ডাটাবেসে উপস্থিত রেকর্ড আপডেট করার জন্য, মডেলের ইনস্ট্যান্সের মাধ্যমে মান পরিবর্তন করা হয় এবং তারপর save() মেথড ব্যবহার করে আপডেট করা হয়।

# প্রথম পোস্টটির শিরোনাম আপডেট করা
post = Post.objects.get(id=1)
post.title = "Updated Blog Post Title"
post.save()

এখানে, প্রথম পোস্টের শিরোনাম পরিবর্তন করে তারপর save() মেথড দিয়ে ডাটাবেসে সেভ করা হয়েছে।

৬. রেকর্ড মুছে ফেলা (Deleting records)

ডাটাবেস থেকে একটি রেকর্ড মুছে ফেলতে delete() মেথড ব্যবহার করা হয়।

# প্রথম পোস্টটি মুছে ফেলা
post = Post.objects.get(id=1)
post.delete()

এটি ডাটাবেস থেকে নির্দিষ্ট পোস্ট মুছে ফেলবে।


Django ORM এর মাধ্যমে আরও জটিল Query তৈরি করা

Django ORM এ আরও জটিল এবং কাস্টম কোয়েরি তৈরি করতে Q অবজেক্ট, exclude(), order_by() ইত্যাদি ব্যবহার করা যেতে পারে।

১. exclude() - ফলাফল থেকে কিছু রেকর্ড বাদ দেয়া

# যেখানে title 'First' দিয়ে শুরু না হয়, সেগুলি পাওয়া
posts = Post.objects.exclude(title__startswith='First')

২. order_by() - রেকর্ড সাজানো

# পোস্টগুলো সাজানো ক্রমে
posts = Post.objects.all().order_by('created_at')

এটি পোস্টগুলিকে created_at ক্ষেত্র অনুসারে ক্রমবর্ধমানভাবে সাজাবে। '-created_at' ব্যবহার করলে তারিখ অনুযায়ী অবতরণ করা যাবে।

৩. Q অবজেক্ট ব্যবহার করে জটিল শর্ত

from django.db.models import Q

# Q অবজেক্ট ব্যবহার করে একাধিক শর্ত প্রয়োগ
posts = Post.objects.filter(Q(title__startswith='First') | Q(content__contains='Django'))

এখানে Q অবজেক্টের মাধ্যমে আমরা দুইটি শর্ত দিয়ে কোয়েরি তৈরি করেছি, যেখানে শিরোনাম 'First' দিয়ে শুরু বা কনটেন্টে 'Django' শব্দটি থাকবে।


সারাংশ

Django এর ORM এর মাধ্যমে ডাটাবেসের সাথে যোগাযোগ করা খুবই সহজ। আপনি ORM এর মাধ্যমে ডাটাবেসের CRUD অপারেশন খুব সহজেই করতে পারেন। এতে আপনি Python কোডেই SQL কোডের কাজ করতে পারেন, যা ডাটাবেসের সাথে কাজ করার প্রক্রিয়াকে অনেক সহজ এবং দ্রুত করে তোলে।

Content added By

Complex Query, Filtering, এবং Aggregation

219

Django ORM (Object-Relational Mapping) আপনাকে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে সাহায্য করে, যাতে আপনি SQL কোড না লিখেও জটিল কুয়েরি, ফিল্টারিং, এবং অ্যাগ্রিগেশন অপারেশন করতে পারেন। Django তে complex queries, filtering, এবং aggregation এর জন্য বিভিন্ন শক্তিশালী ফিচার রয়েছে যা ডেটা ব্যবস্থাপনায় সহজতা আনে।


Complex Query in Django

Django ORM আপনাকে কমপ্লেক্স কুয়েরি তৈরি করার জন্য শক্তিশালী ফিচার সরবরাহ করে। এর মাধ্যমে আপনি জটিল ডেটাবেস কুয়েরি তৈরি করতে পারেন, যেমন জয়েন (JOIN), সাব-কুয়েরি (Subquery), এবং কন্ডিশনাল কুয়েরি (Conditional Query)।

১. Q Objects ব্যবহার করে জটিল কুয়েরি

Q objects Django-তে একটি পদ্ধতি যা বিভিন্ন কন্ডিশনগুলিকে একত্রিত করতে সাহায্য করে, যেমন AND বা OR অপারেটর। Q objects ব্যবহার করে আপনি কন্ডিশনাল কুয়েরি তৈরি করতে পারেন।

উদাহরণ:

from django.db.models import Q
from .models import Product

# যেখানে price 100 এর বেশি অথবা নাম "Laptop"
products = Product.objects.filter(Q(price__gt=100) | Q(name='Laptop'))

এখানে Q(price__gt=100) | Q(name='Laptop') কন্ডিশনটি দুটি শর্তের মধ্যে OR অপারেটর প্রয়োগ করবে। অর্থাৎ, price 100-এর বেশি অথবা name "Laptop" হলে, তা অন্তর্ভুক্ত হবে।

২. সাব-কুয়েরি (Subquery) ব্যবহার

Django ORM সাব-কুয়েরি ব্যবহার করতে সাহায্য করে। উদাহরণস্বরূপ, একটি সাব-কুয়েরি ব্যবহার করে আমরা একক মডেল থেকে নির্দিষ্ট ডেটা পেতে পারি।

from django.db.models import Subquery, OuterRef
from .models import Author, Book

# Authors যাদের বইয়ের সংখ্যা 5 এর বেশি
books_count = Book.objects.filter(author=OuterRef('pk')).count()
authors = Author.objects.annotate(book_count=Subquery(books_count)).filter(book_count__gt=5)

এখানে, Subquery ব্যবহার করে আমরা প্রতিটি Author এর জন্য তার বইয়ের সংখ্যা গণনা করছি এবং শুধুমাত্র সেই Author গুলো ফিল্টার করছি যাদের বইয়ের সংখ্যা 5 এর বেশি।


Filtering in Django

Django ORM আপনাকে বিভিন্ন ধরনের ফিল্টারিং অপারেশন করতে সাহায্য করে। filter() মেথড ব্যবহার করে আপনি ডেটাবেস থেকে নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে রেকর্ড নির্বাচন করতে পারেন।

১. Filter with Exact Match

# Filter products with exact name "Laptop"
products = Product.objects.filter(name='Laptop')

২. Filter with Range

# Filter products where price is between 50 and 200
products = Product.objects.filter(price__range=(50, 200))

৩. Filter with Case-insensitive Match

# Filter products with name 'laptop', case-insensitive
products = Product.objects.filter(name__iexact='laptop')

৪. Filter with Contains

# Filter products where name contains the word 'Laptop'
products = Product.objects.filter(name__icontains='laptop')

৫. Filter with Foreign Key Relationships

# Filter products that belong to a specific category
products = Product.objects.filter(category__name='Electronics')

এখানে category__name ব্যবহার করে আমরা Product মডেল থেকে সেই সমস্ত প্রোডাক্টস ফিল্টার করছি যেগুলোর category ফিল্ডের নাম "Electronics"।

৬. Filter with Exclusion

# Filter products where name does not contain 'Laptop'
products = Product.objects.exclude(name__icontains='laptop')

এখানে exclude() মেথড ব্যবহার করে আমরা সব প্রোডাক্ট বাদ দিচ্ছি যেগুলোর নাম "Laptop" অন্তর্ভুক্ত।


Aggregation in Django

Aggregation হল একাধিক রেকর্ডের উপরে গণনা (count), গড় (average), সর্বোচ্চ (maximum), সর্বনিম্ন (minimum) ইত্যাদি পরিসংখ্যানিক অপারেশন। Django ORM এ aggregate() মেথড ব্যবহার করে আপনি সহজে অ্যাগ্রিগেশন করতে পারেন।

১. Sum, Average, Count, Min, Max ব্যবহার করা

Django-তে কিছু সাধারণ অ্যাগ্রিগেশন ফাংশন রয়েছে:

  • Sum: একটি ফিল্ডের মানের যোগফল
  • Avg: একটি ফিল্ডের গড়
  • Count: একটি ফিল্ডের মধ্যে রেকর্ডের সংখ্যা
  • Min: একটি ফিল্ডের সর্বনিম্ন মান
  • Max: একটি ফিল্ডের সর্বোচ্চ মান
from django.db.models import Sum, Avg, Count, Max, Min
from .models import Product

# Total price of all products
total_price = Product.objects.aggregate(Sum('price'))

# Average price of all products
average_price = Product.objects.aggregate(Avg('price'))

# Count of all products
total_products = Product.objects.aggregate(Count('id'))

# Maximum and minimum price of products
price_range = Product.objects.aggregate(Max('price'), Min('price'))

২. Multiple Aggregations একত্রে ব্যবহার করা

আপনি একাধিক অ্যাগ্রিগেশন একসাথে করতে পারেন:

# Total price, average price, and count in one query
result = Product.objects.aggregate(
    total_price=Sum('price'),
    average_price=Avg('price'),
    product_count=Count('id')
)

print(result)

এটি একটি ডিকশনারি রিটার্ন করবে, যেখানে total_price, average_price, এবং product_count এর মান থাকবে।

৩. Annotate ব্যবহার করে Aggregation

আপনি annotate() ব্যবহার করে প্রতিটি কিউরি সেটে অ্যাগ্রিগেশন করতে পারেন, যা একটি গ্রুপ অনুযায়ী অ্যাগ্রিগেশন ফিচার সরবরাহ করে।

from django.db.models import Count
from .models import Category

# Categories with the number of products
categories = Category.objects.annotate(num_products=Count('product'))

এখানে annotate() ব্যবহার করে প্রতিটি Category-এর সাথে সংশ্লিষ্ট Product সংখ্যা গণনা করা হয়েছে।


সারাংশ

Django ORM এর মাধ্যমে আপনি জটিল কুয়েরি, ফিল্টারিং এবং অ্যাগ্রিগেশন অপারেশন খুব সহজেই পরিচালনা করতে পারেন। Q objects, filter(), এবং aggregate() এর মতো ফিচারগুলি Django-কে শক্তিশালী ডেটাবেস অপারেশন করতে সহায়তা করে। এর সাহায্যে আপনি ডেটা সহজে বিশ্লেষণ এবং পরিচালনা করতে পারবেন, এবং আপনার অ্যাপ্লিকেশনকে আরও কার্যকরী করতে পারবেন।

Content added By

Django ORM এর Manager এবং Custom Manager

241

Django-র ORM (Object-Relational Mapping) সিস্টেম একটি শক্তিশালী এবং ব্যবহারবান্ধব পদ্ধতি, যা ডেটাবেসের সাথে যোগাযোগ করতে সাহায্য করে। ORM এর মাধ্যমে আপনি ডেটাবেসের টেবিলগুলোর সাথে কাজ করতে পারেন, যেমন পঠন (Read), লেখা (Write), আপডেট (Update) এবং মুছে ফেলা (Delete)। Django ORM এর সাথে কাজ করার সময় Manager এবং Custom Manager দুটি গুরুত্বপূর্ণ বিষয়।


Django ORM এর Manager

Django-র Manager হলো একটি বিশেষ ক্লাস, যা মডেলের (Model) সাথে সম্পর্কিত ডেটাবেস অপারেশন পরিচালনা করে। এটি ডিফল্টভাবে মডেল ক্লাসের সাথে আসে এবং ডেটাবেসের রেকর্ডগুলি পরিচালনা করতে বিভিন্ন পদ্ধতি (Methods) প্রদান করে।

১. Manager এর কাজ

Manager ডেটাবেসের সাথে কাজ করার জন্য বিভিন্ন কার্যকরী মেথড সরবরাহ করে, যেমন filter(), exclude(), get(), create() ইত্যাদি। প্রতি মডেলের জন্য একটি ডিফল্ট Manager থাকে, যা আপনাকে সাধারণভাবে ডেটাবেস অপারেশন করতে সাহায্য করে।

উদাহরণ:
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()

    # Default manager
    objects = models.Manager()

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

    # Default manager
    objects = models.Manager()

এখানে, Author এবং Book মডেলগুলির জন্য objects নামক ডিফল্ট Manager পাওয়া যাচ্ছে, যা আপনাকে ডেটাবেসের রেকর্ডগুলি পরিচালনা করতে সাহায্য করবে। আপনি objects Manager ব্যবহার করে যেমন ডেটা বের করতে পারবেন:

# All books
books = Book.objects.all()

# Books filtered by author
books_by_author = Book.objects.filter(author__name="John Doe")

Custom Manager

আপনি যদি আপনার প্রোজেক্টে কিছু কাস্টম লজিক প্রয়োগ করতে চান, তাহলে আপনি একটি Custom Manager তৈরি করতে পারেন। Custom Manager-এ আপনি আপনার নিজস্ব মেথড যোগ করতে পারেন যা সাধারণভাবে ব্যবহৃত হয়, যেমন নির্দিষ্ট শর্তে ডেটা ফিল্টার করা বা একটি কাস্টম কুয়েরি তৈরি করা।

১. Custom Manager তৈরি করা

Custom Manager তৈরি করতে, আপনাকে models.Manager ক্লাসের একটি নতুন সাবক্লাস তৈরি করতে হবে এবং এতে আপনার কাস্টম মেথডগুলো যোগ করতে হবে।

উদাহরণ:
from django.db import models

class ActiveBookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)
    
    def available_books(self):
        return self.get_queryset().filter(is_available=True)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)
    is_available = models.BooleanField(default=True)

    # Custom manager
    active_books = ActiveBookManager()

এখানে, ActiveBookManager একটি কাস্টম Manager তৈরি করেছে, যা কেবল active বইগুলোকে ফিল্টার করবে। active_books মেথডটি get_queryset() মেথডটি ওভাররাইড (override) করে, যাতে কেবলমাত্র is_active=True ফিল্ডে থাকা বইগুলো রিটার্ন করা হয়।

২. Custom Manager এর ব্যবহার

এখন আপনি Book মডেলের active_books Manager ব্যবহার করে শুধুমাত্র active বইগুলো পেতে পারেন, যেমন:

# Get all active books
active_books = Book.active_books.all()

# Get available active books
available_books = Book.active_books.available_books()

এই পদ্ধতিতে, Custom Manager এর মাধ্যমে আপনি কাস্টম কুয়েরি লজিক তৈরি এবং প্রয়োগ করতে পারেন।


Manager এবং Custom Manager এর সুবিধা

  • Code Reusability: আপনি একাধিক মডেলে একই ধরনের ডেটাবেস অপারেশন প্রয়োগ করতে Manager ব্যবহার করতে পারেন। এটি কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।
  • Encapsulation: কাস্টম মেথডের মাধ্যমে আপনি ডেটাবেসের অপারেশনগুলোকে একটি জায়গায় রাখতে পারেন এবং মডেল ক্লাসের বাইরে এদের ব্যবহার করতে পারেন।
  • Query Optimization: Custom Manager ব্যবহার করে আপনি বিশেষ ধরনের কুয়েরি বা ফিল্টার লজিক তৈরি করতে পারেন, যা সিস্টেমের পারফরম্যান্স বাড়াতে সহায়ক হতে পারে।

সারাংশ

  • Manager হলো Django ORM এর একটি ক্লাস, যা মডেলের ডেটাবেস অপারেশন পরিচালনা করে।
  • Custom Manager ব্যবহার করে আপনি কাস্টম ডেটাবেস কুয়েরি লজিক তৈরি করতে পারেন এবং এটি মডেল ক্লাসে ইন্টিগ্রেট করতে পারেন।
  • Custom Manager ব্যবহার করে সাধারণভাবে ব্যবহৃত কুয়েরি অপারেশনগুলোকে কাস্টমাইজ করে আরও কার্যকরী এবং পুনঃব্যবহারযোগ্য কোড তৈরি করা যায়।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...